<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>735. 行星碰撞</title>
  </head>
  <body>
    <script>
      //     给定一个整数数组 asteroids，表示在同一行的行星。

      // 对于数组中的每一个元素，其绝对值表示行星的大小，正负表示行星的移动方向（正表示向右移动，负表示向左移动）。每一颗行星以相同的速度移动。

      // 找出碰撞后剩下的所有行星。碰撞规则：两个行星相互碰撞，较小的行星会爆炸。如果两颗行星大小相同，则两颗行星都会爆炸。两颗移动方向相同的行星，永远不会发生碰撞。

      //

      // 示例 1：

      // 输入：asteroids = [5,10,-5]
      // 输出：[5,10]
      // 解释：10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。
      // 示例 2：

      // 输入：asteroids = [8,-8]
      // 输出：[]
      // 解释：8 和 -8 碰撞后，两者都发生爆炸。
      // 示例 3：

      // 输入：asteroids = [10,2,-5]
      // 输出：[10]
      // 解释：2 和 -5 发生碰撞后剩下 -5 。10 和 -5 发生碰撞后剩下 10 。

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/asteroid-collision
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

      /**
       * @param {number[]} asteroids
       * @return {number[]}
       */
      var asteroidCollision = function (asteroids) {
        let result = []
        result.push(asteroids[0])
        debugger
        for (let i = 1; i < asteroids.length; i++) {
          if (result[result.length - 1] > 0 && asteroids[i] < 0) {
            // 前一个往右，后一个往左才会碰撞
            if (result[result.length - 1] > Math.abs(asteroids[i])) {
              // 正值比负值大
              continue
            } else if (result[result.length - 1] === Math.abs(asteroids[i])) {
              // 相等则去除
              result.pop()
            } else {
              // 负值比正值大，需要不断对比栈内元素，直到栈内元素比负值绝对值大或进入栈底(栈内对比元素要为正值)
              while (result[result.length - 1] < Math.abs(asteroids[i])) {
                result.pop()
                if (result.length === 0 || result[result.length - 1] < 0) {
                  result.push(asteroids[i])
                  break
                }
                if (result[result.length - 1] === Math.abs(asteroids[i])) {
                  // 相等则去除
                  result.pop()
                  break
                }
              }
            }
          } else {
            // 添加进结果栈
            result.push(asteroids[i])
          }
        }
        return result
      }

      console.log(asteroidCollision([-2, 2, 1, -2]))
    </script>
  </body>
</html>
